package org.sadhar.sipp.anggaranpendapatankemahasiswaan;

import java.util.List;
import java.util.Map;

import org.sadhar.sia.common.ClassConnection;
import org.sadhar.sia.common.ClassUtility;

public class AnggaranPendapatanKemahasiswaanDAOImpl implements
	AnggaranPendapatanKemahasiswaanDAO {

    @Override
    public void deleteByIdPosAnggaranPendapatanUnitAndKodeTagihan(
	    String idPosAnggaranPendapatanUnit, String kodeTagihan) {
	String sql = "delete FROM ppmk.anggaranPendapatanKemahasiswaan where idPosAnggaranPendapatanUnit = ? and kodeTagihan=?";
	ClassConnection.getJdbc().update(
		sql,
		new Object[] { ClassUtility.quote(idPosAnggaranPendapatanUnit),
			ClassUtility.quote(kodeTagihan) });

    }

    @Override
    public List<Map> listDetailByTahunAnggaran(String tahunAnggaran) {
	String sql = "SELECT apk.idPosAnggaranPendapatanUnit,t.Kd_tagih,uk.Kd_unit_kerja,uk.Nama_unit_kerja,t.nama_tagih,apk.prediksiJmlMhsBaru,apk.tarif,(apk.prediksiJmlMhsBaru * tarif) as jumlah_anggaran "
		+ " FROM ppmk.anggaranPendapatanKemahasiswaan apk "
		+ " inner join kamus.tagihan t on(apk.kodeTagihan = t.Kd_tagih) "
		+ " inner join ppmk.posAnggaranPendapatanUnit papu on (apk.idPosAnggaranPendapatanUnit = papu.idPosAnggaranPendapatanUnit) "
		+ " inner join kamus.unkerja uk on (papu.kodeUnitKerja = uk.Kd_unit_kerja) where papu.tahunAnggaran = ?";
	List<Map> result = ClassConnection.getJdbc().queryForList(sql,
		new Object[] { ClassUtility.quote(tahunAnggaran) });
	String currentNamaUnitKerja = "";
	for (Map m : result) {

	    if (currentNamaUnitKerja.equalsIgnoreCase(m.get("Nama_unit_kerja")
		    .toString())) {
		m.put("Nama_unit_kerja", "");
		m.put("Nama_unit_kerjaHidden", currentNamaUnitKerja);
	    } else {
		currentNamaUnitKerja = m.get("Nama_unit_kerja").toString();
		m.put("Nama_unit_kerjaHidden", "");
	    }
	}
	return result;

    }

    @Override
    public List<Map> listDetailByTahunAnggaranByKdUnitKerja(
	    String tahunAnggaran, String kdUnitKerja) {
	String sql = "SELECT apk.idPosAnggaranPendapatanUnit,t.Kd_tagih,uk.Kd_unit_kerja,uk.Nama_unit_kerja,t.nama_tagih,apk.prediksiJmlMhsBaru,apk.tarif,(apk.prediksiJmlMhsBaru * tarif) as jumlah_anggaran "
		+ " FROM ppmk.anggaranPendapatanKemahasiswaan apk "
		+ " inner join kamus.tagihan t on(apk.kodeTagihan = t.Kd_tagih) "
		+ " inner join ppmk.posAnggaranPendapatanUnit papu on (apk.idPosAnggaranPendapatanUnit = papu.idPosAnggaranPendapatanUnit) "
		+ " inner join kamus.unkerja uk on (papu.kodeUnitKerja = uk.Kd_unit_kerja) where papu.tahunAnggaran = ? and papu.kodeUnitKerja= ?";
	List<Map> result = ClassConnection.getJdbc().queryForList(
		sql,
		new Object[] { ClassUtility.quote(tahunAnggaran),
			ClassUtility.quote(kdUnitKerja) });
	String currentNamaUnitKerja = "";
	for (Map m : result) {

	    if (currentNamaUnitKerja.equalsIgnoreCase(m.get("Nama_unit_kerja")
		    .toString())) {
		m.put("Nama_unit_kerja", "");
		m.put("Nama_unit_kerjaHidden", currentNamaUnitKerja);
	    } else {
		currentNamaUnitKerja = m.get("Nama_unit_kerja").toString();
		m.put("Nama_unit_kerjaHidden", "");
	    }
	}
	return result;
    }

    @Override
    public void insertOrUpdate(AnggaranPendapatanKemahasiswaan apk) {
	String sqlCount = "select * from ppmk.anggaranPendapatanKemahasiswaan where idPosAnggaranPendapatanUnit = ? and kodeTagihan=?";
	List<Map> result = ClassConnection.getJdbc().queryForList(
		sqlCount,
		new Object[] { apk.getIdPosAnggaranPendapatanUnit(),
			apk.getKodeTagihan() });
	if (result.size() > 0) {
	    String sqlUpdate = "update ppmk.anggaranPendapatanKemahasiswaan set prediksiJmlMhsBaru=?,tarif=? where idPosAnggaranPendapatanUnit =? and kodeTagihan=?";
	    ClassConnection.getJdbc().update(
		    sqlUpdate,
		    new Object[] { apk.getPrediksiJmlMhsBaru(), apk.getTarif(),
			    apk.getIdPosAnggaranPendapatanUnit(),
			    apk.getKodeTagihan() });

	} else {
	    String sqlInsert = "insert into ppmk.anggaranPendapatanKemahasiswaan (idPosAnggaranPendapatanUnit,kodeTagihan,prediksiJmlMhsBaru,tarif) values (?,?,?,?)";
	    ClassConnection.getJdbc().update(
		    sqlInsert,
		    new Object[] { apk.getIdPosAnggaranPendapatanUnit(),
			    apk.getKodeTagihan(), apk.getPrediksiJmlMhsBaru(),
			    apk.getTarif() });
	}

    }

    public int countJumlah(AnggaranPendapatanKemahasiswaan apk) {
        String sqlCount = "select * from ppmk.anggaranPendapatanKemahasiswaan where idPosAnggaranPendapatanUnit = ? and kodeTagihan=?";
	List<Map> result = ClassConnection.getJdbc().queryForList(
		sqlCount,
		new Object[] { apk.getIdPosAnggaranPendapatanUnit(),
			apk.getKodeTagihan() });
        return result.size();
    }
}
